﻿#ifndef CORE_H
#define CORE_H
#define TABLE_MAX_SIZE 100000
#include <stdint.h>
#include <include/table.h>
typedef struct __task_queue_node task_queue_node; //任务序列
typedef task_queue_node ready_queue_node;   //就绪任务队列
typedef struct __core_list core_list;   //处理器队列

typedef struct task_struct Task;
typedef struct global_domain Cluster;


//core表
struct core_table
{
    int start;//开始
    int end;//截至
    int task_id;//任务id在这个核心上运行
    int num_seg;
};
//core实例
struct core_domain{
    int core_id;
    int task_scheduled; //-1 - 当前执行任务为NULL
    int table_task_scheduled;
    int core_type;           //0为CPU，1为FPGA，2为GPU，3位DSP
    double rate; //alpha 处理器的处理速率相对单位速率的倍率
    double utilization; //该处理器上CPU利用率总合
    bool isFailed;
    vector<table_schedule> core_table;
    bool is_table_schedule;
    int scheduled_prio;//当前执行任务实例的优先级
    int task_sched_type; //执行是否是表调度
    ready_queue_node *ready_queue; //就绪队列的头结点，按优先级排列
    int owner_cluster;
    int recovery_time; //Z 发生故障后的恢复时间
    int num_segment;
    struct core_table table[200];
    int table_length;
    ready_queue_node *suspend_queue; //阻塞队列的头结点，按优先级排列
    int ceiling_prior;
};
//core_domain 另一个名字叫做Core
typedef struct core_domain Core;

void initCore(int core_id, double rate,int core_tpye);

void initLocalCore(int core_id, double rate,int core_tpye);

core_list * dequeue_core_list(Core *core, Cluster *global);

void enqueue_core_list(core_list *changed, Cluster *global);

Task *GetScheduledTask(Core *core);

void enqueue_utilization(Core *core, core_list *head);  //按照利用率入队

void dequeue_utilization(Core *core, core_list *head);  //按照利用率出队

void queue_core_table(Core *core);

int get_corenum();
#endif // CORE_H
